import axios from 'axios'
import { createDiscreteApi } from 'naive-ui'

// 创建离散 API,这样可以在非组件中使用
const { message } = createDiscreteApi(['message'])

// 创建 axios 实例
const request = axios.create({
  baseURL: import.meta.env.VITE_API_URL, // 从环境变量获取 API 地址
  timeout: 15000
})

// 请求拦截器
request.interceptors.request.use(
  config => {
    // 从 localStorage 获取 token
    const token = localStorage.getItem('token')
    let user = localStorage.getItem('user')
    if(user){
      user = JSON.parse(user)
    }
    if (token) {
      config.headers['Authorization'] ='Bearer ' +  token.replaceAll('"','')
      config.headers['user'] = user.id
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  response => {
    const { code, message, data } = response.data

    // 根据自定义状态码处理
    switch (code) {
      case 200:
        return data
      case 401:
        // token 过期或未登录
        message.error(message ||'登录已过期，请重新登录')
        localStorage.removeItem('token')
        // 可以在这里添加重定向到登录页的逻辑
        window.location.href = '/login'
        return Promise.reject(new Error(message || '未授权'))
      case 403:
        message.error(message ||'没有权限访问该资源')
        return Promise.reject(new Error(message || '禁止访问'))
      case 404:
        message.error(message ||'请求的资源不存在')
        return Promise.reject(new Error(message || '资源不存在'))
      case 500:
        message.error(message ||'服务器错误，请稍后重试')
        return Promise.reject(new Error(message || '服务器错误'))
      default:
        // 处理其他状态码
        if (code && code !== 200) {
          message.error(message || '操作失败')
          return Promise.reject(new Error(message || '操作失败'))
        }
        return data
    }
  },
  error => {
    // 处理 HTTP 状态码错误
    if (error.response) {
      const {  data } = error.response
      console.log(data,data.message,data.code)
      switch (data.code) {
        case 400:
          message.error(data.message || '请求参数错误')
          break
        case 401:
          message.error(data.message ||'登录已过期，请重新登录')
          localStorage.removeItem('token')
          window.location.href = '/login'
          break
        case 403:
          message.error(data.message ||'没有权限访问该资源')
          break
        case 404:
          message.error(data.message ||'请求的资源不存在')
          break
        case 500:
          message.error(data.message ||'服务器错误，请稍后重试')
          break
        default:
          message.error(data.message ||`请求失败`)
      }
    } else if (error.request) {
      // 请求已发出但未收到响应
      if (error.message.includes('timeout')) {
        message.error('请求超时，请稍后重试')
      } else {
        message.error('网络错误，请检查网络连接')
      }
    } else {
      // 请求配置出错
      message.error('请求配置错误')
    }

    return Promise.reject(error)
  }
)

export default request
